篇首语:本文由编程笔记#小编为大家整理,主要介绍了MD 风格的 Dialog ---- MaterialDialog相关的知识,希望对你有一定的参考价值。
一个 MD 风格的 Dialog 的开源项目,GitHub 地址:https://github.com/afollestad/material-dialogs
MaterialDialog:一个漂亮、流畅、可定制的对话框。
核心模块的依赖:compile 'com.afollestad.material-dialogs:core:0.9.6.0'
核心模块包含该库的所有主要类,包括 MaterialDialog。 您可以使用核心创建基本、列表、单/多选项、进度、输入等对话框。
公共模块的依赖:compile 'com.afollestad.material-dialogs:commons:0.9.6.0'
公共模块包含不是每个人都需要的扩展库。 这包括 ColorChooserDialog、FolderChooserDialog、Material Preference 类和 MaterialSimpleListAdapter / MaterialSimpleListItem。
https://github.com/afollestad/material-dialogs/blob/master/sample/sample.apk
new MaterialDialog.Builder(this)// 初始化建造者
.title(R.string.title)// 标题
.content(R.string.content)// 内容
.positiveText(R.string.agree)
.negativeText(R.string.title)
.show();// 显示对话框
注意:Activity 中使用该功能需要 Activity 继承 AppCompat 主题才能正确使用此库。
build():创建对话框
show():显示对话框
dismiss():关闭对话框
类似 AlertDialog 的,有以下两种方式获得MaterialDialog 的实例并显示它。
方式一:
MaterialDialog dialog = new MaterialDialog.Builder(this)
.title(R.string.title)// 标题
.content(R.string.content)// 内容
.positiveText(R.string.agree)
.show();// 显示对话框
方式二:
MaterialDialog.Builder builder = new MaterialDialog.Builder(this)
.title(R.string.title)// 标题
.content(R.string.content)// 内容
.positiveText(R.string.agree);
MaterialDialog dialog = builder.build();// 创建对话框
dialog.show();// 显示对话框
图标显示在标题的左侧。
new MaterialDialog.Builder(this)
.title(R.string.title)// 标题
.content(R.string.content)// 内容
.positiveText(R.string.agree)
.icon(R.drawable.icon) // 标题左侧的图标
.show();// 显示对话框
还可以使用 limitIconToDefaultSize()、maxIconSize(int size)、maxIconSizeRes(int sizeRes) 这些方法来限制图标的最大大小。
如果你有多个操作按钮一起太宽而无法放在一行上,对话框会将这些按钮叠放在垂直方向。
叠放行为在 Builder 中定义,一共有三种叠放行为,分别是
new MaterialDialog.Builder(this)
.title(R.string.title)// 标题
.content(R.string.content)// 内容
.positiveText(R.string.long_positive)
.negativeText(R.string.negative)
.stackingBehavior(StackingBehavior.ADAPTIVE) // 默认值:自适应
.show();// 显示对话框
除了正面和负面文本之外,还可以指定中性文本,它会显示最左边的中立动作。
new MaterialDialog.Builder(this)
.title("设备列表")// 标题
.content("content")// 内容
.positiveText(R.string.long_positive)
.negativeText(R.string.negative)
.neutralText(R.string.more_info)
.show();// 显示对话框
从版本 0.8.2.0 开始,callback() Builder 方法已被弃用,以支持下面讨论的各个回调方法。 早期版本仍然需要使用 ButtonCallback。
new MaterialDialog.Builder(this)
.onPositive(new MaterialDialog.SingleButtonCallback()
@Override
public void onClick(MaterialDialog dialog, DialogAction which)
// TODO
)
.onNeutral(new MaterialDialog.SingleButtonCallback()
@Override
public void onClick(MaterialDialog dialog, DialogAction which)
// TODO
)
.onNegative(new MaterialDialog.SingleButtonCallback()
@Override
public void onClick(MaterialDialog dialog, DialogAction which)
// TODO
)
.onAny(new MaterialDialog.SingleButtonCallback() // 此方法可以监听所有三个动作按钮
@Override
public void onClick(MaterialDialog dialog, DialogAction which)
if (DialogAction.POSITIVE == which)
// TODO:
else if (DialogAction.NEGATIVE == which)
// TODO:
else if (DialogAction.NEUTRAL == which)
// TODO:
);
注意:如果 autoDismiss 关闭,则必须在这些回调中手动关闭对话框。自动关闭默认开启。
复选框提示可以显示类似于 android 用来请求 API 23+ 权限的 UI。
注意:也可以在列表对话框和输入对话框中使用复选框提示。
new MaterialDialog.Builder(this)
.iconRes(R.drawable.ic_default_icon)// 标题左侧的图标
.limitIconToDefaultSize()// 标题左侧图标的最大值
.title("title6")// 标题
.positiveText("Allow")
.negativeText("Deny")
.onAny(new MaterialDialog.SingleButtonCallback()
@Override
public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which)
Toast.makeText(TestActivity.this, "Prompt checked ? " + dialog.isPromptCheckBoxChecked(),
Toast.LENGTH_SHORT).show();
)
.checkBoxPromptRes(R.string.app_name, false, null)
.show();// 显示对话框
String[] items = "A", "BB", "CCC", "DDDD", "EEEEE";
new MaterialDialog.Builder(this)
.title("title7")// 标题
.items(items)// 列表数据
.itemsCallback(new MaterialDialog.ListCallback()
@Override
public void onSelection(MaterialDialog dialog, View itemView, int position, CharSequence text)
Toast.makeText(TestActivity.this, "position = " + position + " , text = " + text, Toast.LENGTH_SHORT).show();
)
.show();// 显示对话框
注意:如果 autoDismiss 关闭,则必须手动关闭回调中的对话框,自动关闭默认开启。你可以将 positiveText() 或其他操作按钮传递给构建器以强制它显示列表下方的操作按钮,但是这仅在某些特定情况下有用。
单选列表对话框与常规列表对话框几乎相同,唯一的区别是使用 itemsCallbackSingleChoice 设置回调而不是 itemsCallback,这表示对话框显示列表项旁边的单选按钮。
String[] items = "A", "BB", "CCC", "DDDD", "EEEEE";
new MaterialDialog.Builder(this)
.title("title8")// 标题
.items(items)// 列表数据
// itemsCallbackSingleChoice 方法中的第一个参数代表预选项的索引值,没有预选项这个值就设置为 -1,有预选项就传入一个预选项的索引值即可。
// 如果不使用自定义适配器,则可以使用 MaterialDialog 实例上的 setSelectedIndex(int) 更新选定的索引值。
.itemsCallbackSingleChoice(1, new MaterialDialog.ListCallbackSingleChoice()
@Override
public boolean onSelection(MaterialDialog dialog, View itemView, int which, CharSequence text)
// 如果使用 alwaysCallSingleChoiceCallback() 方法,在这边返回 false 将不允许新选择的单选按钮被选中。
return true;
)
// 如果没有使用 positiveText() 设置正面操作按钮,则当用户按下正面操作按钮时,
// 对话框将自动调用单一选择回调方法,该对话框也将自行关闭,除非关闭自动关闭。
.positiveText("Choose")
// 如果调用 alwaysCallSingleChoiceCallback() 该方法,则每次用户选择/取消项目时都会调用单选回调方法。
.alwaysCallSingleChoiceCallback()
.show();// 显示对话框
像“动作”按钮和“材质”对话框中的许多其他元素一样,您可以自定义对话框单选按钮的颜色。 Builder类包含一个widgetColor(),widgetColorRes(),widgetColorAttr()和choiceWidgetColor()方法。 他们的名字和参数注释使他们自我解释。
widgetColor是影响其他UI元素的相同颜色。 choiceWidgetColor特定于单个和多个选择对话框,它仅影响单选按钮和复选框。 您提供了一个ColorStateList,而不是用于生成ColorStateList的单一颜色。
请注意,默认情况下,单选按钮将使用ColorAccent(用于AppCompat)或android:colorAccent(用于Material主题)中的颜色在活动主题中着色。
本自述文件的全局主题部分中还有一个全局主题属性:md_widget_color。
多选列表对话框与常规列表对话框几乎相同,唯一的区别是使用 itemsCallbackMultiChoice 设置回调而不是 itemsCallback,这表示对话框显示列表项旁边的复选框,并且回调可以返回多个选择。
String[] items = "A", "BB", "CCC", "DDDD", "EEEEE";
new MaterialDialog.Builder(this)
.title("title")// 标题
.items(items)// 列表数据
// itemsCallbackMultiChoice 方法中的第一个参数代表预选项的值,没有预选项这个值就设置为 null,有预选项就传入一组预选项的索引值即可。
.itemsCallbackMultiChoice(null, new MaterialDialog.ListCallbackMultiChoice()
@Override
public boolean onSelection(MaterialDialog dialog, Integer[] which, CharSequence[] text)
// 如果使用 alwaysCallMultiChoiceCallback() 方法,在这边返回 false 将不允许新选择的单选按钮被选中。
return true;
)
// 如果没有使用 positiveText() 设置正面操作按钮,则当用户按下正面操作按钮时,
// 对话框将自动调用多项选择回调方法,该对话框也将自行关闭,除非关闭自动关闭。
.positiveText("Choose")
// 如果调用 alwaysCallMultiChoiceCallback() 该方法,则每次用户选择/取消项目时都会调用多项选择回调方法。
.alwaysCallMultiChoiceCallback()
.show();// 显示对话框
像“动作”按钮和“材质”对话框中的许多其他元素一样,您可以自定义对话框复选框的颜色。 Builder类包含一个widgetColor(),widgetColorRes(),widgetColorAttr()和choiceWidgetColor()方法。 他们的名字和参数注释使他们自我解释。
widgetColor是影响其他UI元素的相同颜色。 choiceWidgetColor特定于单个和多个选择对话框,它仅影响单选按钮和复选框。 您提供了一个ColorStateList,而不是用于生成ColorStateList的单一颜色。
请注意,默认情况下,单选按钮将使用ColorAccent(用于AppCompat)或android:colorAccent(用于Material主题)中的颜色在活动主题中着色。
本自述文件的全局主题部分中还有一个全局主题属性:md_widget_color。
如果需要通过 ID 而不是索引来跟踪列表项目,则可以从整数数组中分配项目 ID,还可以传递一个文字整数数组(int [])来代替数组资源 ID。
String[] items = "A", "BB", "CCC", "DDDD", "EEEEE";
int[] ids = 0, 1, 2, 3, 4;
new MaterialDialog.Builder(this)
.title("title")// 标题
.items(items)// 列表数据
.itemsIds(ids)// 列表 ID
.itemsCallback(new MaterialDialog.ListCallback()
@Override
public void onSelection(MaterialDialog dialog, View itemView, int position, CharSequence text)
Toast.makeText(TestActivity.this, "position = " + position + " , text = " + text
+ " , ID = " + itemView.getId(), Toast.LENGTH_SHORT).show();
)
.show();// 显示对话框
与 Android 的对话框类似,你可以通过 .adapter() 传递自己的适配器来自定义列表的工作方式。
String[] items = "A", "BB", "CCC", "DDDD", "EEEEE";
new MaterialDialog.Builder(this)
.title("title")// 标题
// adapter 方法中第一个参数表示自定义适配器,该适配器必须继承 RecyclerView.Adapter
// 第二个参数表示布局管理器,如果不需要设置就为 null,可选择的值只有线性布局管理器(LinearLayoutManager)
// 和网格布局管理器(GridLayoutManager)两种
.adapter(new ButtonItemAdapter(this, items), null)
.show();// 显示对话框
/**
* 自定义适配器
*/
private class ButtonItemAdapter extends RecyclerView.Adapter
private Context mContext;
private String[] items = null;
ButtonItemAdapter(Context mContext, String[] items)
this.mContext = mContext;
this.items = items;
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
// TODO
return null;
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position)
// TODO
@Override
public int getItemCount()
return items.length;
注意:对于较新的版本,MaterialDialog 不再支持 ListView 和 ListAdapter,都改成使用 RecycleView了。还有自定义适配器中必须要自行处理项目的点击事件。
MaterialDialog dialog = new MaterialDialog.Builder(this)
...
.build();
RecyclerView list = dialog.getRecyclerView();
// Do something with it.
dialog.show();
boolean wrapInScrollView = true;
new MaterialDialog.Builder(this)
.title("title")// 标题
// 自定义视图,参数一表示自定义视图的布局,参数二表示是否将自定义视图放置在 ScrollView 中,
// 这允许用户根据需要滚动自定义视图(小屏幕、长内容等)。但是,有些情况下不需要使用这种行为,
// 这些情况主要包括在自定义布局中包含 ScrollView、ListViews、RecycleViews、WebViews、GridViews 等
// wrapInScrollView 该值为 true 时,自定义视图会自动填充它。
.customView(R.layout.activity_login, wrapInScrollView)
.positiveText("Positive")
.show();// 显示对话框
如果需要在构建对话框后访问自定义视图中的视图,则可以使用 MaterialDialog 的 getCustomView() 获得自定义视图的对象。如果将布局资源传给 Builder,则对话框会处理布局的初始化工作。
MaterialDialog dialog = // ... initialization via the builder ...
View view = dialog.getCustomView();// 获取对话框中的自定义视图对象
new MaterialDialog.Builder(this)
.title("title")// 标题
.content("content")// 内容
.typeface("Roboto.ttf", "Roboto-Light.ttf")// 字体
.show();// 显示对话框
修改字体调用 Builder 中的 .typeface(String, String) 方法即可,其中字体时从 assets/font 中提取的。这个方法还将通过 TypefaceHelper 处理循环字体,可以在自己的项目中使用该字体以避免重复分配。原始字体变量不会被回收,每次调用都会再次分配该字体。还有一个全局主题属性可用于自动将字体应用于应用程序中的每一个 MaterialDialog 中。
获取对话框的操作按钮:
MaterialDialog dialog = // ... initialization via the builder ...
View positive = dialog.getActionButton(DialogAction.POSITIVE);
View negative = dialog.getActionButton(DialogAction.NEGATIVE);
View neutral = dialog.getActionButton(DialogAction.NEUTRAL);
更新对话框操作按钮的标题:
MaterialDialog dialog = // ... initialization via the builder ...
dialog.setActionButton(DialogAction.NEGATIVE, "New Title");
在 Lollipop 之前,如果不使用反射和自定义绘图,主题化 AlertDialogs 基本上是不可能的,自从 KitKat 之后,Android 变得更加色彩中性,但 AlertDialogs 继续使用 Holo Blue 作为标题和标题分隔符,除了动作按钮,Lollipop 还有更多的改进,默认对话框中没有颜色,但是 MaterialDialog 使得主题化更容易。
默认情况下,MaterialDialog 将基于从创建对话框的上下文中检索 ?android:textColorPrimary 属性中应用浅色主题或深色主题。也可以使用全局主题属性来设置。
new MaterialDialog.Builder(this)
.title("title")// 标题
.content("content")// 内容
.theme(Theme.DARK)// 主题
.show();// 显示对话框
使用该项目创建的对话框几乎所有方面都可以被着色。
new MaterialDialog.Builder(this)
.title("title")// 标题
.titleColorRes(R.color.pager_title_1)// 标题颜色
.content("content")// 内容
.contentColor(Color.BLUE)// 内容颜色
.linkColorAttr(R.attr.civ_fill_color)
.dividerColorRes(R.color.pager_title_2)// 分割线颜色
.backgroundColorRes(R.color.interact_color_press)// 背景颜色
.positiveText("Positive")
.positiveColorRes(R.color.pager_title_1)
.negativeText("Negative")
.negativeColorRes(R.color.pager_title_2)
.neutralText("Neutral")
.neutralColorRes(R.color.pager_title_3)
.widgetColorRes(R.color.pager_title_1)// 适用于进度条、复选框和单选按钮
.buttonRippleColorRes(R.color.pager_title_2)
.show();
注意:这些方法中的每一种都有三种方法可以直接设置颜色,分别是:
选择器是可以在按下或放开时改变状态的绘图。
new MaterialDialog.Builder(this)
// 设置所有操作按钮的选择器
.btnSelector(R.drawable.custom_btn_selector)
// 仅设置 Positive 这个操作按钮的选择器,这样使得 Positive 这个操作按钮与其他操作按钮有不同的选择器
.btnSelector(R.drawable.custom_btn_selector_primary, DialogAction.POSITIVE)
// 设置当按钮叠放时使用的选择器,可能是因为没有足够的控件将它们全部放在一行上,或者在 Builder 上使用 forceStacked(true)
.btnSelectorStacked(R.drawable.custom_btn_selector_stacked)
// 在不使用自定义适配器时,listSelector 用于列表项目的选择器
.listSelector(R.drawable.custom_list_stackedbtn_selector)
.show();// 显示对话框
注意:与使用自定义操作按钮选择器相关的重要说明:确保你的选择器可绘制的引用插入可绘制图像就像默认的那样——这对于正确的动作按钮填充很重要。
new MaterialDialog.Builder(this)
.title("title")// 标题
.titleGravity(GravityEnum.CENTER)// 标题的位置
.content("content")// 内容
.contentGravity(GravityEnum.CENTER)// 内容的位置
.positiveText("Positive")
.negativeText("Negative")
.neutralText("Neutral")
.btnStackedGravity(GravityEnum.END)// 操作按钮的位置
.itemsGravity(GravityEnum.END)// 当你不使用适配器时,列表项的位置
.buttonsGravity(GravityEnum.END)
.show();// 显示对话框
对于 buttonsGravity 的位置表示如下所示:
START(Default) | Neutral | Negative | Positive |
---|---|---|---|
CENTER | Negative | Neutral | Positive |
END | Positive | Negative | Neutral |
注意:如果没有 Positive 按钮,就用 Negative 代替,除了 CENTER。
http://www.google.com/design/spec/style/color.html#color-color-palette
new MaterialDialog.Builder(this)
.title("Use Google's Location Services?")// 标题
.content("Let Google help apps determine location. This means sending " +
"anonymous location data to Google, even when no apps are running.")// 内容
.positiveText("Agree")
.showListener(new DialogInterface.OnShowListener() // 设置显示监听器
@Override
public void onShow(DialogInterface dialogInterface)
Toast.makeText(TestActivity.this, "showListener", Toast.LENGTH_SHORT).show();
)
.cancelListener(new DialogInterface.OnCancelListener() // 设置取消监听器
@Override
public void onCancel(DialogInterface dialogInterface)
Toast.makeText(TestActivity.this, "cancelListener", Toast.LENGTH_SHORT).show();
)
.dismissListener(new DialogInterface.OnDismissListener() // 关闭对话框监听器
@Override
public void onDismiss(DialogInterface dialogInterface)
Toast.makeText(TestActivity.this, "dismissListener", Toast.LENGTH_SHORT).show();
)
// 在对话框之外禁用关闭对话框的功能,默认为 true 表示在对话框之外点击就关闭对话框,
// 反之,该值为 false 时表示在对话框之外点击就禁用关闭对话框的功能
.cancelable(true)
.show();// 显示对话框
new MaterialDialog.Builder(this)
.title("Input")// 标题
.content("input content")// 内容
.inputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD)// 输入类型
.input("input hint", "input prefill", new MaterialDialog.InputCallback()
@Override
public void onInput(@NonNull MaterialDialog dialog, CharSequence input)
Toast.makeText(TestActivity.this, "do something...", Toast.LENGTH_SHORT).show();
)
.show();// 显示对话框
输入对话框会自动处理对 EditText 的对焦饼显示键盘以允许用户立即输入,当对话框关闭时,键盘将被自动解除。
注意:当按下输入提交给回调时,该对话框将强制显示 positive 操作按钮,另外,输入类型是可选项,不一定非要设置。
可自定义输入对话框中 EditText 的颜色,使用方法:widgetColor()、widgetColorRes()、widgetColorAttr()
注意:默认情况下,EditText 将使用 AppCompat 中的 colorAccent 属性或者 Material 主题中的 android:colorAccent 属性。
全局属性:md_widget_color。
new MaterialDialog.Builder(this)
.title("Input")// 标题
.inputRangeRes(2, 20, R.color.pager_title_3)// 限制输入范围
.input(null, null, new MaterialDialog.InputCallback()
@Override
public void onInput(@NonNull MaterialDialog dialog, CharSequence input)
Toast.makeText(TestActivity.this, "Do something...", Toast.LENGTH_SHORT).show();
)
.show();// 显示对话框
启用或禁用 EditText 的最简单方法是从 Builder 中调用 alwaysCallInputCallback() 方法,以便当用户更改输入时调用回调函数,这个方法可以不断检查输入的内容,如果决定不能提交,可以在回调中使用它来禁用提交按钮:
dialog.getActionButton(DialogAction.POSITIVE).setEnabled(false);
(1)不确定进度条对话框:
new MaterialDialog.Builder(this)
.title("progress dialog")// 标题
.content("please wait")// 内容
.progress(true, 0)// 不确定进度条
.show();// 显示对话框
(2)确定进度条对话框(Seek Bar):
MaterialDialog dialog = new MaterialDialog.Builder(this)
.title("progress dialog")// 标题
.content("please wait")// 内容
// 第一个参数表示是否是不确定的,该值为 true 表示是不确定进度条,反之为确定进度条
// 第二个参数表示进度条的最大值
// 第三个参数表示是否显示百分比,如果该值为 true 表示显示百分比,反之不显示百分比
.progress(false, 150, true)// 确定进度条
.show();// 显示对话框
while (dialog.getCurrentProgress() != dialog.getMaxProgress())
if (dialog.isCancelled())
break;
try
Thread.sleep(50);
catch (InterruptedException e)
e.printStackTrace();
dialog.incrementProgress(1);
dialog.setContent("Done");
new MaterialDialog.Builder(this)
.title("progress dialog")// 标题
.content("please wait")// 内容
.progress(true, 0)// 不确定进度条
.progressIndeterminateStyle(true)
.show();// 显示进度条
可自定义输入对话框中进度条的颜色,使用方法:widgetColor()、widgetColorRes()、widgetColorAttr()
注意:默认情况下,进度条将使用 AppCompat 中的 colorAccent 属性或者 Material 主题中的 android:colorAccent 属性。
全局属性:md_widget_color。
new MaterialDialog.Builder(this)
.title("title")// 标题
.content("content")// 内容
.progress(false, 150, true)
// 自定义编号
.progressNumberFormat("01/50")
// 自定义进度格式
.progressPercentFormat(NumberFormat.getPercentInstance())
.show();// 显示进度条
MDTintHelp:动态地为复选框、单选项、编辑框、进度条着色,
~该部分是扩展功能,暂时未记录~